import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  CreateDateColumn,
  ManyToOne,
  JoinColumn,
} from 'typeorm';

import { User } from '@/modules/app/entities';
import { ApiHideProperty } from '@nestjs/swagger';
import { IsEnum, IsNumber, IsOptional } from 'class-validator';

export enum EventType {
  /** 饮食记录事件 */
  DIET_LOG = 'DIET_LOG',
  /** 营养分析事件 */
  NUTRITION_ANALYSIS = 'NUTRITION_ANALYSIS',
  /** 营养教育事件 */
  NUTRITION_EDUCATION = 'NUTRITION_EDUCATION',
  /** 抗炎食物排行事件 */
  ANTI_INFLAMMATORY_RANKING = 'ANTI_INFLAMMATORY_RANKING',
  /** 我的信息查看事件 */
  PROFILE_VIEW = 'PROFILE_VIEW',
  /** 访客事件 */
  VISIT = 'VISIT',
  /** 打卡事件 */
  CHECK_IN = 'CHECK_IN',
}

@Entity('analytics')
export class Analytics {
  /**
   * 事件ID
   */
  @PrimaryGeneratedColumn('increment')
  analyticsId: number;

  /**
   * 事件类型
   * DIET_LOG: 饮食记录事件
   * NUTRITION_ANALYSIS: 营养分析事件
   * NUTRITION_EDUCATION: 营养教育事件
   * ANTI_INFLAMMATORY_RANKING: 抗炎食物排行事件
   * PROFILE_VIEW: 我的信息查看事件
   * VISIT: 访客事件
   * CHECK_IN: 打卡事件
   */
  @IsEnum(EventType)
  @Column({
    type: 'enum',
    enum: EventType,
  })
  eventType: EventType;

  /**
   * 事件模块名称
   */
  @IsOptional()
  @Column()
  module?: string;

  /**
   * 用户ID
   */
  @IsNumber()
  @Column({ nullable: true })
  userId: number;

  @ApiHideProperty()
  @ManyToOne(() => User, (user) => user.analyticsEvents, {
    /**
     * 当主表中的一条记录被删除时，数据库会自动删除与之关联的外键记录
     * 也就是 user 被删除，该条数据也会被删除
     * 是针对外键的
     */
    // onDelete: 'CASCADE',
    /**
     * 保存或删除主表记录时，TypeORM 会自动对关联的实体执行相应的操作
     * 针对主表的
     */
    // cascade: true
    onDelete: 'CASCADE',
  })
  @JoinColumn({ name: 'userId' })
  user?: User;

  @CreateDateColumn()
  createdAt?: Date;
}
